package Thread;

public class Demo12 {

    private static boolean isQuit = false;
    //问:如果吧这里的isQuit改成main方法局部变量,这个代码是否任然可以正常执行
    //不行,原因(变量捕获):Java中的捕获的变量必须是final或者事实final
    //事实final就是虽然没有标记为final类型,但是实际上并没有对变量进行修改
    //写成成员变量之后就可以了,原因是此时走的语法是"内部类访问外部类的成员,这件事是可以的"和"变量捕获无关了"
    //lambda表达式本质上是一个"函数式接口"产生的"匿名内部类"
    //内部类本来就能访问外部类的成员

    /*
    在 Java 中，变量捕获允许 Lambda 表达式和匿名内部类访问其定义时的外部作用域中的局部变量。
    被捕获的变量需要是有效的最终变量，这样可以避免在并发环境中的状态不一致问题。
     */

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() ->{
            while(!isQuit){
                System.out.println("hello Thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("t线程执行结束");
        });

        t.start();

        Thread.sleep(2000);
        //修改isQuit变量,就能影响到t线程结束了
        System.out.println("main线程尝试终止t线程");
        isQuit = true;

        //程序运行的结果宏观上依然表明多个线程同时在执行,包括main线程和t线程
    }
}
